// // 扩展
// //字符串的扩展 
// // substring(start,stop) 不包含stop 
// // substr(start,length) 
// // indexof() 首次出现的位置

// let str = 'hello world'
// console.log(str.startsWith('he'))

// if(str.indexOf('h')!=-1){
//     //是否存在h
// }

// console.log(str.includes('h'))


// for (const char of str) {
//     console.log(char)    
// }

// //重复
// // str.repeat()
// console.log('a'.repeat(5)) // 重复多少次
// console.log('abc'.repeat(3.6))

// // 补全
// let s2 = 'a'
// console.log(s2.padStart(5,'xy未'))  // 头部补全
// console.log(s2.padEnd(5,'xy未'))  //尾部补全

// //数值扩展
// parseInt(2.2365)
// Number.parseInt(2.3625)

// console.log(Number.isInteger(10))  //判断是否是整数

// // Math 对象
// Math.random() // 随机数 0-1 但是不包括0/1
// Math.ceil(3.6) // 向上 4
// Math.floor(3.9) // 向下 3
// Math.round(3.9) // 四舍五入
// Math.trunc(3.6) //3
// Math.trunc(-3.6) //-3
// Math.sign(-3.6) //判断数值是正数（1），负数（-1），零（0），其它 NaN

// 2**2 //指数运算

// 函数扩展 
//ES 5
// function fun(x,y){
//     y = y||10;
//     console.log(x,y)
// }
// fun(2)
// //ES 6
// function fun(x,y=10){    
//     console.log(x,y)
// }
// fun(2)

// function fun(...values){
//     console.log(values)
// }
// fun(1,23,4,56,7,88,9,9,8,7,6,)


// 箭头函数 this指向
// 不能使用new
var f = () => {} 
// 箭头函数，没有对应的原型属性

// this 箭头函数中 的this执行是定时时的this，而不是执行时的this 
// this 指向调用者的
function Fun(){
    this.i = 0;
    setTimeout(function(){ // 它的this是window
        console.log(this)
    },2000)
}

var f3 = new Fun();

function Fun(){
    this.i = 0;
    setTimeout(()=>{ // 它的this是外层调用者
        console.log(this)
    },2000)
}

var f3 = new Fun();
// 注意：

// 对象中的箭头函数代表window对象
var obj = {
    age:18,
    getAgeA:function(){
        console.log(this.age) //obj
    },
    getAgeB:()=>{
        console.log(this.age) //window
    }

}
obj.getAgeA();
obj.getAgeB();
// 对象中的箭头函数，实现外层调用者的方式
var obj = {
    age:18,
    getAgeA:function(){
        console.log(this.age) //obj
    },
    getAgeB:()=>{
        var fn = ()=>this.age; // obj
        return fn();        
    }

}
obj.getAgeA();
obj.getAgeB(); 



//apply() call()
function  Cat(name,color){
    this.name = name;
    this.color = color;
}

var cat = new Cat()
var o = {}

Cat.apply(o,['1111','222']) //Cat 函数在o中执行
console.log(o.name)
console.log(o.color)

// 双冒号运算符 :: 左边是一个对象，右边是一个函数 自动将左边的对象绑定到右边的函数上面
// o::Cat(['1111','2222']);  // ===  Cat.apply(o,['1111','222']) //Cat 函数在o中执行

// 作用域 当全局作用域和局部作用域变量名称相同时，优先用局部作用域变量
var x = 1;
function fn(x,a = x){ //
    console.log(a)  //10 
};
f(10);

var x = 1
function fn(a = x){
    let x = 10;
    console.log(a)
}
fn()

// 严格模式 'use strict'
function gn(){
    'use strict'
    return '';
}

// ... 扩展运算符
// 用于函数的调用
// fun(数组，参数)

var a = [];
function fun(a,arr){

}
//ES6 
var arr1 = [1,2,3]
var arr2 = [4,5,6]
arr1.push(...arr2)


function get(...items){
    console.log(items)
}
var num = [1,2,3]
var num2 = [4,5,6]
get([1,...num,2,...num2])

// 深拷贝
var a1 = [1,{name:'dovey'},3,4]
var a2 = a1.concat();
var a3 = [...a1]; //ES6
a2[1] = 100;
a3[1] = 100;
console.log(a1)
console.log(a2)
console.log(a3)

// 数组的合并
var t = [...a1,...a2,...a3];
console.log(t)

//解构
var [a,b,c,d] = [1,2,3,4]
var [a,...b] = [1,2,3,4] // b 为扩展数组
console.log(a)
console.log(b)

var [a,...b,c] = [1,2,3,4] //error  扩展运算符只能放在参数的最后以为

// 字符串转数组
var str = 'hello';
console.log(str.split(''))
//ES6 
console.log([...str])

// 

